export { }

// 1. 函数设置类型
/**
 * js中函数存在的缺点：
 * 1）实参和形参个数可以不一致
 * 2）对参数的类型没有约束
 */

// 1.1 函数的参数必须设置类型
function sum(num1: number, num2: number): number {
    return num1 + num2
}
sum(100, 200)

// 1.2 函数的返回值可以不加类型, TS的类型推导会推出返回值的类型
function getIndex(arr: number[], value: number) {
    return arr.findIndex((item) => { item === value })
}
getIndex([1, 2, 3, 6, 7, 5, 8, 9], 5)

// 1.3 函数表达式
// 登录函数，参数：用户名/密码,返回值：布尔类型
const loginFn = (userName: string, password: string): boolean => {
    if (userName === 'admin' && password === '123456') {
        return true
    } else {
        return false
    }
}
loginFn('admin', '123456')

type loginFunc = (userName: string, password: string) => boolean
const loginFn2: loginFunc = (userName, password) => {
    if (userName === 'admin' && password === '123456') {
        return true
    } else {
        return false
    }
}
loginFn2('admin', '123456')

// 1.4 可选参数
function buildName(firstName: string, lastName?: string) {
    if (lastName) {
        return `${firstName}·${lastName}`
    } else {
        return firstName
    }
}
buildName('张三', '李四')
buildName('王五')

// 1.5 无返回值
// 在js中, 一个函数没有返回值, 输出是: undefined
// 在ts中, undefined是一种明确的类型, 如果函数的返回值类型是 undefined, 那么函数必须返回 undefined
// 在提示中, 如果函数没有返回值, 那么函数的返回值类型是void
function eachArr(arr: string[]): void {
    arr.forEach((item) => {
        console.log(item)
    })
}
eachArr(['张三', '李四'])

// 小练习
function arr2Str(arr: Array<string | number>, separator: string = ',') {
    return arr.join(separator)
}
console.log(arr2Str([1, 2, 3, 5, 8], '&'))
console.log(arr2Str([1, 2, 3, 5, 8], '-'))
console.log(arr2Str(['1', 5, 888]))